Java 中序列化与反序列化,看这篇就够了!

您所在的位置:网站首页 反序列化 readobject Java 中序列化与反序列化,看这篇就够了!

Java 中序列化与反序列化,看这篇就够了!

2023-08-14 09:26| 来源: 网络整理| 查看: 265

一、 序列化和反序列化概念

Serialization(序列化)是一种将对象以一连串的字节描述的过程;反序列化deserialization是一种将这些字节重建成一个对象的过程。将程序中的对象,放入文件中保存就是序列化,将文件中的字节码重新转成对象就是反序列化。

 

二、 序列化和反序列化的必要性

当两个进程进行远程通信时,可以相互发送各种类型的数据,包括文本、图片、音频、视频等, 而这些数据都会以二进制序列的形式在网络上传送。 而java是面向对象的开发方式,一切都是java对象,想要实现java对象的网络传输,就可以使用序列化和反序列化来实现。发送方将需要发送的Java对象序列化转换为字节序列,然后在网络上传送;接收方接收到字符序列后,使用反序列化从字节序列中恢复出Java对象。

当我们了解了为什么需要Java序列化和反序列化后,我们很自然地会想Java序列化的好处。

一是实现了数据的持久化,通过序列化可以把数据永久地保存到硬盘上(通常存放在文件里); 二是利用序列化实现远程通信,即在网络上传送对象的字节序列。

总结,在网络中数据的传输必须是序列化形式来进行的。其他序列化的方式可以是json传输,xml形式传输。

 

三、 序列化和反序列化的实现 1.  JDK类库提供的序列化API java.io.ObjectOutputStream:表示对象输出流 它的writeObject(Object obj)方法可以对参数指定的obj对象进行序列化,把得到的字节序列写到一个目标输出流中。 java.io.ObjectInputStream:表示对象输入流 它的readObject()方法从源输入流中读取字节序列,再把它们反序列化成为一个对象,并将其返回。 2.  实现序列化的要求

只有实现了Serializable或Externalizable接口的类的对象才能被序列化,否则抛出异常。

3. 实现Java对象序列化与反序列化的方法

假定一个Student类,它的对象需要序列化,可以有如下三种方法:

方法一:若Student类仅仅实现了Serializable接口,则可以按照以下方式进行序列化和反序列化。 ObjectOutputStream采用默认的序列化方式,对Student对象的非transient的实例变量进行序列化。 ObjcetInputStream采用默认的反序列化方式,对对Student对象的非transient的实例变量进行反序列化。 方法二:若Student类仅仅实现了Serializable接口,并且还定义了readObject(ObjectInputStream in)和writeObject(ObjectOutputSteam out),则采用以下方式进行序列化与反序列化。 ObjectOutputStream调用Student对象的writeObject(ObjectOutputStream out)的方法进行序列化。 ObjectInputStream会调用Student对象的readObject(ObjectInputStream in)的方法进行反序列化。 方法三:若Student类实现了Externalnalizable接口,且Student类必须实现readExternal(ObjectInput in)和writeExternal(ObjectOutput out)方法,则按照以下方式进行序列化与反序列化。 ObjectOutputStream调用Student对象的writeExternal(ObjectOutput out))的方法进行序列化。 ObjectInputStream会调用Student对象的readExternal(ObjectInput in)的方法进行反序列化。 4.  JDK类库中序列化的步骤

步骤一:创建一个对象输出流,它可以包装一个其它类型的目标输出流,如文件输出流:

ObjectOutputStream out = new ObjectOutputStream(new fileOutputStream(“D:\\objectfile.obj”));

步骤二:通过对象输出流的writeObject()方法写对象:

out.writeObject(“Hello”); out.writeObject(new Date()); 5.  JDK类库中反序列化的步骤

步骤一:创建一个对象输入流,它可以包装一个其它类型输入流,如文件输入流:

ObjectInputStream in = new ObjectInputStream(new fileInputStream(“D:\\objectfile.obj”));

步骤二:通过对象输出流的readObject()方法读取对象:

String obj1 = (String)in.readObject(); Date obj2 = (Date)in.readObject();

说明:为了正确读取数据,完成反序列化,必须保证向对象输出流写对象的顺序与从对象输入流中读对象的顺序一致。 为了更好地理解Java序列化与反序列化,选择方法一编码实现。 Student类定义如下:

/** * 实现了序列化接口的学生类 */ public class Student implements Serializable { private String name; private char sex; private int year; private double gpa; public Student() { } public Student(String name,char sex,int year,double gpa) { this.name = name; this.sex = sex; this.year = year; this.gpa = gpa; } public void setName(String name) { this.name = name; } public void setSex(char sex) { this.sex = sex; } public void setYear(int year) { this.year = year; } public void setGpa(double gpa) { this.gpa = gpa; } public String getName() { return this.name; } public char getSex() { return this.sex; } public int getYear() { return this.year; } public double getGpa() { return this.gpa; } }

把Student类的对象序列化到文件/Users/sschen/Documents/student.txt,并从该文件中反序列化,向console显示结果。代码如下:



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3